diff -Naur tweak-3.02/actions.c tweak-3.02.patched/actions.c
--- tweak-3.02/actions.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/actions.c	2021-09-07 14:21:21.913810300 -0400
@@ -112,11 +112,11 @@
 		display_write_str (question);
 		display_refresh();
 	    }
-	    safe_update = TRUE;
+	    safe_update = true;
 #endif
 	    c = display_getkey();
 #if defined(unix) && !defined(GO32)
-	    safe_update = FALSE;
+	    safe_update = false;
 #endif
 	    if (c >= 'a' && c <= 'z')
 		c += 'A'-'a';
@@ -130,32 +130,43 @@
 	    return;		       /* don't even quit */
 	}
     }
-    finished = TRUE;
+    finished = true;
 }
 
-static void act_save(void) {
-    static int backed_up = FALSE;
+static bool act_save_internal(void) {
+    static bool backed_up = false;
 
+    if (look_mode) {
+	display_beep();
+	strcpy (message, "Cannot save in LOOK mode!");
+	return false;
+    }
     if (!backed_up) {
 	if (!backup_file()) {
 	    display_beep();
 	    strcpy (message, "Unable to back up file!");
-	    return;
+	    return false;
 	}
-	backed_up = TRUE;
+	backed_up = true;
     }
     if (!save_file()) {
 	display_beep();
 	strcpy (message, "Unable to save file!");
-	return;
+	return false;
     }
-    modified = FALSE;
+    modified = false;
+    return true;
+}
+
+static void act_save(void) {
+    act_save_internal();               /* just discard the bool return value */
 }
 
 static void act_exitsave(void) {
-    act_save();
-    draw_scr();			       /* update ** on status line */
-    act_exit();
+    if (act_save_internal()) {
+        draw_scr();                    /* update ** on status line */
+        act_exit();
+    }
 }
 
 static void act_top (void) {
@@ -294,7 +305,7 @@
 	display_beep();
 	sprintf(message, "Can't engage Insert mode when in %s mode",
 		(look_mode ? "LOOK" : "FIX"));
-	insert_mode = FALSE;	       /* safety! */
+	insert_mode = false;	       /* safety! */
     } else
 	insert_mode = !insert_mode;
 }
@@ -307,7 +318,7 @@
 }
 
 void act_self_ins(void) {
-    int insert = insert_mode;
+    bool insert = insert_mode;
     unsigned char c;
 
     if (look_mode) {
@@ -352,17 +363,17 @@
 	buf_fetch_data(filedata, &c, 1, cur_pos);
 	c &= 0xF0;
 	c |= last_char;
-	insert = FALSE;
+	insert = false;
 	break;
     }
 
     if (insert) {
 	buf_insert_data(filedata, &c, 1, cur_pos);
 	file_size++;
-	modified = TRUE;
+	modified = true;
     } else if (cur_pos < file_size) {
 	buf_overwrite_data(filedata, &c, 1, cur_pos);
-	modified = TRUE;
+	modified = true;
     } else {
 	display_beep();
 	strcpy(message, "End of file reached");
@@ -379,7 +390,7 @@
 	buf_delete (filedata, 1, cur_pos);
 	file_size--;
 	edit_type = !!edit_type;
-	modified = TRUE;
+	modified = true;
     }
 }
 
@@ -391,7 +402,7 @@
 	buf_delete (filedata, 1, cur_pos);
 	file_size--;
 	edit_type = !!edit_type;
-	modified = TRUE;
+	modified = true;
     }
 }
 
@@ -399,7 +410,7 @@
     if (look_mode) {
 	display_beep();
 	strcpy (message, "Can't cut or paste in LOOK mode");
-	marking = FALSE;	       /* safety */
+	marking = false;	       /* safety */
 	return;
     }
     marking = !marking;
@@ -435,8 +446,8 @@
     if (top_pos > cur_pos)
 	top_pos = begline(cur_pos);
     edit_type = !!edit_type;
-    modified = TRUE;
-    marking = FALSE;
+    modified = true;
+    marking = false;
 }
 
 static void act_copy (void) {
@@ -456,7 +467,7 @@
     if (cutbuffer)
 	buf_free (cutbuffer);
     cutbuffer = buf_copy (filedata, marksize, marktop);
-    marking = FALSE;
+    marking = false;
 }
 
 static void act_paste (void) {
@@ -475,7 +486,7 @@
 	file_size -= cutsize;
     }
     buf_paste (filedata, cutbuffer, cur_pos);
-    modified = TRUE;
+    modified = true;
     cur_pos += cutsize;
     file_size += cutsize;
     edit_type = !!edit_type;
@@ -494,9 +505,9 @@
 static void act_goto (void) {
     char buffer[80];
     fileoffset_t position, new_top;
-    int error;
+    bool error;
 
-    if (!get_str("Enter position to go to: ", buffer, FALSE))
+    if (!get_str("Enter position to go to: ", buffer, false))
 	return;			       /* user break */
 
     position = parse_num (buffer, &error);
@@ -531,16 +542,16 @@
 	statfmt = decstatus;
 }
 
-static int search_prompt(char *withdef, char *withoutdef)
+static bool search_prompt(char *withdef, char *withoutdef)
 {
     char buffer[80];
     int len;
 
-    if (!get_str(last_search ? withdef : withoutdef, buffer, TRUE))
-	return 0;		       /* user break */
+    if (!get_str(last_search ? withdef : withoutdef, buffer, true))
+	return false;                  /* user break */
     if (!last_search && !*buffer) {
 	strcpy (message, "Search aborted.");
-	return 0;
+	return false;
     }
 
     if (!*buffer) {
@@ -550,14 +561,14 @@
 	if (len == -1) {
 	    display_beep();
 	    strcpy (message, "Invalid escape sequence in search string");
-	    return 0;
+	    return false;
 	}
 	if (last_search)
 	    free_search(last_search);
 	last_search = build_search (buffer, len);
     }
 
-    return 1;
+    return true;
 }
 
 static void act_search (void) {
@@ -660,10 +671,10 @@
     char prompt[80];
     fileoffset_t w;
     fileoffset_t new_top;
-    int error;
+    bool error;
 
     sprintf (prompt, "Enter screen width in bytes (now %"OFF"d): ", width);
-    if (!get_str (prompt, buffer, FALSE))
+    if (!get_str (prompt, buffer, false))
 	return;
     w = parse_num (buffer, &error);
     if (error) {
@@ -686,11 +697,11 @@
     char prompt[80];
     fileoffset_t o;
     fileoffset_t new_top;
-    int error;
+    bool error;
 
     sprintf (prompt, "Enter start-of-file offset in bytes (now %"OFF"d): ",
 	     realoffset);
-    if (!get_str (prompt, buffer, FALSE))
+    if (!get_str (prompt, buffer, false))
 	return;
     o = parse_num (buffer, &error);
     if (error) {
diff -Naur tweak-3.02/btree.c tweak-3.02.patched/btree.c
--- tweak-3.02/btree.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/btree.c	2021-09-07 14:21:21.902810301 -0400
@@ -47,7 +47,7 @@
  *  - user-supplied copy function.
  *  - bt_add when element already exists.
  *  - bt_del when element doesn't.
- *  - splitpos with before==TRUE.
+ *  - splitpos with before==true.
  *  - split() on sorted elements (but it should be fine).
  *  - bt_replace, at all (it won't be useful until we get user read
  *    properties).
@@ -162,13 +162,6 @@
     free(p);
 }
 
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-#define TRUE 1
-#endif
-
 /* We could probably do with more compiler-specific branches of this #if. */
 #if defined(__GNUC__)
 #define INLINE __inline
@@ -274,7 +267,7 @@
 /*
  * Determine whether a node is a leaf node or not.
  */
-static INLINE int bt_is_leaf(btree *bt, nodeptr n)
+static INLINE bool bt_is_leaf(btree *bt, nodeptr n)
 {
     return n[0].na.p == NULL;
 }
@@ -292,7 +285,7 @@
 #else
     memset((char *)ret + bt->propoffset, 0, bt->propsize);
 #endif
-    testlock(TRUE, TRUE, ret);
+    testlock(true, true, ret);
     return ret;
 }
 
@@ -301,7 +294,7 @@
  */
 static INLINE void bt_destroy_node(btree *bt, nodeptr n)
 {
-    testlock(TRUE, FALSE, n);
+    testlock(true, false, n);
     /* Free the property. */
     bt->propmerge(bt->userstate, NULL, NULL, n + bt->maxdegree * 2 + 2);
     sfree(n);
@@ -312,8 +305,8 @@
  */
 static INLINE nodeptr bt_reuse_node(btree *bt, nodeptr n, int nsubtrees)
 {
-    testlock(TRUE, FALSE, n);
-    testlock(TRUE, TRUE, n);
+    testlock(true, false, n);
+    testlock(true, true, n);
     n[bt->maxdegree*2-1].i = nsubtrees;
     return n;
 }
@@ -405,10 +398,10 @@
     if (addr.p && addr.p[bt->maxdegree*2+1].i > 1) {
 	nodeptr clone = bt_clone_node(bt, addr.p);
 	bt_set_child(bt, a, index, bt_node_addr(bt, clone));
-	testlock(TRUE, TRUE, clone);
+	testlock(true, true, clone);
 	return clone;
     }
-    testlock(TRUE, TRUE, addr.p);
+    testlock(true, true, addr.p);
     return addr.p;
 }
 static INLINE nodeptr bt_write_lock_root(btree *bt)
@@ -417,21 +410,21 @@
     if (addr.p && addr.p[bt->maxdegree*2+1].i > 1) {
 	nodeptr clone = bt_clone_node(bt, addr.p);
 	bt->root = bt_node_addr(bt, clone);
-	testlock(TRUE, TRUE, clone);
+	testlock(true, true, clone);
 	return clone;
     }
-    testlock(TRUE, TRUE, addr.p);
+    testlock(true, true, addr.p);
     return addr.p;
 }
 static INLINE nodeptr bt_read_lock(btree *bt, node_addr a)
 {
-    testlock(FALSE, TRUE, a.p);
+    testlock(false, true, a.p);
     return a.p;
 }
 #define bt_read_lock_root(bt) (bt_read_lock(bt, (bt)->root))
 #define bt_read_lock_child(bt,a,index) (bt_read_lock(bt,bt_child(bt,a,index)))
 
-static INLINE void bt_write_relock(btree *bt, nodeptr n, int props)
+static INLINE void bt_write_relock(btree *bt, nodeptr n, bool props)
 {
     int i, ns, count;
 
@@ -443,8 +436,8 @@
     for (i = 0; i < ns; i++)
 	count += bt_child_count(bt, n, i);
     n[bt->maxdegree*2].i = count;
-    testlock(TRUE, FALSE, n);
-    testlock(TRUE, TRUE, n);
+    testlock(true, false, n);
+    testlock(true, true, n);
 
     /*
      * Update user read properties.
@@ -477,13 +470,13 @@
 }
 
 static INLINE node_addr bt_write_unlock_internal(btree *bt, nodeptr n,
-						 int props)
+						 bool props)
 {
     node_addr ret;
 
     bt_write_relock(bt, n, props);
 
-    testlock(TRUE, FALSE, n);
+    testlock(true, false, n);
 
     ret.p = n;
     return ret;
@@ -491,7 +484,7 @@
 
 static INLINE node_addr bt_write_unlock(btree *bt, nodeptr n)
 {
-    return bt_write_unlock_internal(bt, n, TRUE);
+    return bt_write_unlock_internal(bt, n, true);
 }
 
 static INLINE void bt_read_unlock(btree *bt, nodeptr n)
@@ -500,7 +493,7 @@
      * For trees in memory, we do nothing here, except run some
      * optional testing.
      */
-    testlock(FALSE, FALSE, n);
+    testlock(false, false, n);
 }
 
 /* ----------------------------------------------------------------------
@@ -594,14 +587,14 @@
  * searching for that element.
  * 
  * Return value is either the index of the element, or the index of
- * the subtree (both 0 upwards). `is_elt' returns FALSE or TRUE
+ * the subtree (both 0 upwards). `is_elt' returns false or true
  * respectively.
  * 
  * Since this may be used by bt_find() with an alternative cmpfn_t,
  * we always pass the input element as the first argument to cmp.
  */
 static int bt_lookup_cmp(btree *bt, nodeptr n, bt_element_t element,
-			 cmpfn_t cmp, int *is_elt)
+			 cmpfn_t cmp, bool *is_elt)
 {
     int mintree = 0, maxtree = bt_subtrees(bt, n)-1;
 
@@ -610,7 +603,7 @@
 	int c = cmp(bt->userstate, element, bt_element(bt, n, elt));
 
 	if (c == 0) {
-	    *is_elt = TRUE;
+	    *is_elt = true;
 	    return elt;
 	} else if (c < 0) {
 	    /*
@@ -634,7 +627,7 @@
      * to search next.
      */
     assert(mintree == maxtree);
-    *is_elt = FALSE;
+    *is_elt = false;
     return mintree;
 }
 
@@ -986,7 +979,8 @@
 			   int relation, int *index)
 {
     nodeptr n, n2;
-    int child, is_elt;
+    int child;
+    bool is_elt;
     bt_element_t gotit;
     int pos = 0;
 
@@ -1083,7 +1077,8 @@
 			 int *index)
 {
     nodeptr n, n2;
-    int i, j, count, is_elt;
+    int i, j, count;
+    bool is_elt;
     void **props;
     int *counts;
     bt_element_t *elts;
@@ -1294,7 +1289,8 @@
 bt_element_t bt_add(btree *bt, bt_element_t element)
 {
     nodeptr n, n2;
-    int child, is_elt;
+    int child;
+    bool is_elt;
     int pos = 0;
 
     n = bt_read_lock_root(bt);
@@ -1322,7 +1318,8 @@
 {
     nodeptr n, c, c2, saved_n;
     nodeptr *nodes;
-    int nnodes, child, nroot, pos2, ends, st, splitpoint, saved_pos;
+    int nnodes, child, pos2, ends, st, splitpoint, saved_pos;
+    bool nroot;
     bt_element_t e, ret;
 
     /*
@@ -1334,7 +1331,7 @@
     nnodes = 0;
 
     n = bt_write_lock_root(bt);
-    nroot = TRUE;
+    nroot = true;
     saved_n = NULL;
 
     if (!n || pos < 0 || pos >= bt_node_count(bt, n)) {
@@ -1405,7 +1402,7 @@
 		    bt_shift_root(bt, n, bt_node_addr(bt, c));
 		    nnodes--;	       /* don't leave it in nodes[]! */
 		    n = NULL;
-		    bt_write_relock(bt, c, TRUE);
+		    bt_write_relock(bt, c, true);
 		} else
 		    bt_write_unlock(bt, c);
 	    } else {
@@ -1422,7 +1419,7 @@
 
 	    if (n) {
 		/* Recompute the counts in n so we can do lookups again. */
-		bt_write_relock(bt, n, TRUE);
+		bt_write_relock(bt, n, true);
 
 		/* Having done the transform, redo the position lookup. */
 		pos = pos2;
@@ -1485,7 +1482,7 @@
 
 	/* Descend to the child and go round again. */
 	n = c;
-	nroot = FALSE;
+	nroot = false;
     }
 
     /*
@@ -1725,7 +1722,7 @@
  * Perform the healing process after a tree has been split. `rhs'
  * is set if the cut edge is the one on the right.
  */
-static void bt_split_heal(btree *bt, int rhs)
+static void bt_split_heal(btree *bt, bool rhs)
 {
     nodeptr n;
     nodeptr *nodes;
@@ -1881,15 +1878,15 @@
      * which will sort all that out for us.
      */
     while (nnodes-- > 0) {
-	bt_write_unlock_internal(bt1, lnodes[nnodes], FALSE);
-	bt_write_unlock_internal(bt2, rnodes[nnodes], FALSE);
+	bt_write_unlock_internal(bt1, lnodes[nnodes], false);
+	bt_write_unlock_internal(bt2, rnodes[nnodes], false);
     }
 
     /*
      * Then we make a healing pass down each side of the tree.
      */
-    bt_split_heal(bt1, TRUE);
-    bt_split_heal(bt2, FALSE);
+    bt_split_heal(bt1, true);
+    bt_split_heal(bt2, false);
 
     ifree(lnodes);
     ifree(rnodes);
@@ -1900,7 +1897,7 @@
 /*
  * Split a tree at a numeric index.
  */
-btree *bt_splitpos(btree *bt, int index, int before)
+btree *bt_splitpos(btree *bt, int index, bool before)
 {
     btree *ret;
     node_addr na;
@@ -1932,15 +1929,16 @@
  */
 btree *bt_split(btree *bt, bt_element_t element, cmpfn_t cmp, int rel)
 {
-    int before, index;
+    bool before;
+    int index;
 
     assert(rel != BT_REL_EQ);	       /* has to be an inequality */
 
     if (rel == BT_REL_GT || rel == BT_REL_GE) {
-	before = TRUE;
+	before = true;
 	rel = (rel == BT_REL_GT ? BT_REL_LE : BT_REL_LT);
     } else {
-	before = FALSE;
+	before = false;
     }
     if (!bt_findrelpos(bt, element, cmp, rel, &index))
 	index = -1;
@@ -1979,7 +1977,7 @@
     n = bt_read_lock_root(bt);
     i = bt_subtrees(bt, n);
     bt_read_unlock(bt, n);
-    return (i == 2 ? TRUE : FALSE);
+    return (i == 2 ? true : false);
 }
 
 /*
@@ -2394,7 +2392,7 @@
 	printf("splittest: %d\n", i);
 	tree3 = BT_COPY(tree);
 	testlock(-1, 0, NULL);
-	tree4 = bt_splitpos(tree3, i, 0);
+	tree4 = bt_splitpos(tree3, i, false);
 	testlock(-1, 0, NULL);
 	verifytree(tree3, array, i);
 	verifytree(tree4, array+i, arraylen-i);
diff -Naur tweak-3.02/btree.h tweak-3.02.patched/btree.h
--- tweak-3.02/btree.h	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/btree.h	2021-09-07 14:21:21.903810301 -0400
@@ -31,6 +31,7 @@
 #define BTREE_H
 
 #include <stddef.h> /* for offsetof */
+#include <stdbool.h>
 
 #ifndef alignof
 #define alignof(typ) ( offsetof(struct { char c; typ t; }, t) )
@@ -47,7 +48,7 @@
 typedef void (*propmergefn_t)(void *state, void *s1, void *s2, void *dest);
 typedef int (*searchfn_t)(void *tstate, void *sstate, int ntrees,
 			  void **props, int *counts,
-			  bt_element_t *elts, int *is_elt);
+			  bt_element_t *elts, bool *is_elt);
 
 enum {
     BT_REL_EQ, BT_REL_LT, BT_REL_LE, BT_REL_GT, BT_REL_GE
@@ -77,7 +78,7 @@
 bt_element_t bt_del(btree *bt, bt_element_t element);
 btree *bt_join(btree *bt1, btree *bt2);
 btree *bt_joinr(btree *bt1, btree *bt2);
-btree *bt_splitpos(btree *bt, int index, int before);
+btree *bt_splitpos(btree *bt, int index, bool before);
 btree *bt_split(btree *bt, bt_element_t element, cmpfn_t cmp, int rel);
 
 #endif /* BTREE_H */
diff -Naur tweak-3.02/buffer.c tweak-3.02.patched/buffer.c
--- tweak-3.02/buffer.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/buffer.c	2021-09-07 14:21:21.917810299 -0400
@@ -3,6 +3,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #include <ctype.h>
 #include <assert.h>
 
@@ -112,7 +113,7 @@
 
 static int bufblksearch(void *tstate, void *sstate, int ntrees,
 			void **props, int *counts,
-			bt_element_t *elts, int *is_elt)
+			bt_element_t *elts, bool *is_elt)
 {
     fileoffset_t *disttogo = (fileoffset_t *)sstate;
     fileoffset_t distsofar = 0;
@@ -128,7 +129,7 @@
 	    /*
 	     * Descend into this subtree.
 	     */
-	    *is_elt = FALSE;
+	    *is_elt = false;
 	    return i;
 	}
 
@@ -142,7 +143,7 @@
 		 * Select this element.
 		 */
 		*disttogo -= distsofar;
-		*is_elt = TRUE;
+		*is_elt = true;
 		return i;
 	    }
 
@@ -164,6 +165,16 @@
     return index;
 }
 
+static void fread_check(void *buf, size_t size, FILE *fp)
+{
+    if (fread(buf, 1, size, fp) != size) {
+        display_cleanup();
+        fprintf(stderr, "Fatal error reading from file: %s\n",
+                strerror(errno));
+        exit(1);
+    }
+}
+
 /*
  * Convert a file-data block of size at most BUFMAX into a
  * literal-data block. Returns the replacement block (the old one
@@ -179,7 +190,7 @@
 	ret->filepos = 0;
 	ret->len = blk->len;
 	fseeko(blk->file->fp, blk->filepos, SEEK_SET);
-	fread(ret->data, blk->len, 1, blk->file->fp);
+	fread_check(ret->data, blk->len, blk->file->fp);
 
 	return ret;
     }
@@ -298,7 +309,7 @@
     return index + 1;
 }
 
-static btree *buf_bt_split(btree *bt, fileoffset_t pos, int before)
+static btree *buf_bt_split(btree *bt, fileoffset_t pos, bool before)
 {
     int index = buf_bt_splitpoint(bt, pos);
     return bt_splitpos(bt, index, before);
@@ -318,14 +329,14 @@
 
 static void buf_insert_bt(buffer *buf, btree *bt, fileoffset_t pos)
 {
-    btree *right = buf_bt_split(buf->bt, pos, FALSE);
+    btree *right = buf_bt_split(buf->bt, pos, false);
     buf->bt = buf_bt_join(buf->bt, bt);
     buf->bt = buf_bt_join(buf->bt, right);
 }
 
 static int bufblklensearch(void *tstate, void *sstate, int ntrees,
 			   void **props, int *counts,
-			   bt_element_t *elts, int *is_elt)
+			   bt_element_t *elts, bool *is_elt)
 {
     fileoffset_t *output = (fileoffset_t *)sstate;
     fileoffset_t size = 0;
@@ -347,7 +358,7 @@
     *output = size;
 
     /* Actual return value doesn't matter */
-    *is_elt = TRUE;
+    *is_elt = true;
     return 1;
 }
 
@@ -417,7 +428,7 @@
 
 	if (blk->file) {
 	    fseeko(blk->file->fp, blk->filepos + poswithin, SEEK_SET);
-	    fread(data, thislen, 1, blk->file->fp);
+	    fread_check(data, thislen, blk->file->fp);
 	} else {
 	    memcpy(data, blk->data + poswithin, thislen);
 	}
@@ -473,8 +484,8 @@
 
 extern void buf_delete(buffer *buf, fileoffset_t len, fileoffset_t pos)
 {
-    btree *left = buf_bt_split(buf->bt, pos, TRUE);
-    btree *right = buf_bt_split(buf->bt, len, FALSE);
+    btree *left = buf_bt_split(buf->bt, pos, true);
+    btree *right = buf_bt_split(buf->bt, len, false);
 
     bt_free(buf->bt);
 
@@ -490,8 +501,8 @@
 
 extern buffer *buf_cut(buffer *buf, fileoffset_t len, fileoffset_t pos)
 {
-    btree *left = buf_bt_split(buf->bt, pos, TRUE);
-    btree *right = buf_bt_split(buf->bt, len, FALSE);
+    btree *left = buf_bt_split(buf->bt, pos, true);
+    btree *right = buf_bt_split(buf->bt, len, false);
     btree *ret = buf->bt;
 
     buf->bt = buf_bt_join(left, right);
@@ -501,8 +512,8 @@
 
 extern buffer *buf_copy(buffer *buf, fileoffset_t len, fileoffset_t pos)
 {
-    btree *left = buf_bt_split(buf->bt, pos, TRUE);
-    btree *right = buf_bt_split(buf->bt, len, FALSE);
+    btree *left = buf_bt_split(buf->bt, pos, true);
+    btree *right = buf_bt_split(buf->bt, len, false);
     btree *ret = bt_clone(buf->bt);
 
     buf->bt = buf_bt_join(left, buf->bt);
diff -Naur tweak-3.02/curses.c tweak-3.02.patched/curses.c
--- tweak-3.02/curses.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/curses.c	2021-09-07 14:21:21.918810299 -0400
@@ -61,7 +61,7 @@
 #define MAXCOLOURS 32
 int attrs[MAXCOLOURS];
 
-void display_define_colour(int colour, int fg, int bg, int reverse)
+void display_define_colour(int colour, int fg, int bg, bool reverse)
 {
     static int colours[8] = {
         COLOR_BLACK,
@@ -117,24 +117,28 @@
 	    schedule_update();
 	    continue;
 	}
+        if (ret == ERR) {
+            /* A failure to read from standard input is fatal */
+            exit(1);
+        }
 	return ret;
     }
 }
 
-int display_input_to_flush(void)
+bool display_input_to_flush(void)
 {
     int ret;
     if (last_getch != ERR)
-	return TRUE;
+	return true;
 
     nodelay(stdscr, 1);
     ret = getch();
     nodelay(stdscr, 0);
     if (ret == ERR)
-	return FALSE;
+	return false;
 
     last_getch = ret;
-    return TRUE;
+    return true;
 }
 
 void display_post_error(void)
diff -Naur tweak-3.02/keytab.c tweak-3.02.patched/keytab.c
--- tweak-3.02/keytab.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/keytab.c	2021-09-07 14:21:21.920810299 -0400
@@ -61,16 +61,33 @@
 /*
  * Format an ASCII code into a printable description of the key stroke.
  */
-static void strkey (char *s, int k) {
-    k &= 255;			       /* force unsigned */
-    if (k==27)
-	strcpy(s, " ESC");
-    else if (k<32 || k==127)
-	sprintf(s, " ^%c", k ^ 64);
-    else if (k<127)
-	sprintf(s, " %c", k);
-    else
-	sprintf(s, " <0x%2X>", k);
+struct strkey_state {
+    char *s, *end;
+    bool truncated;
+};
+static void strkey (struct strkey_state *sks, int k) {
+    char thisbuf[32];
+
+    if (sks->truncated)
+        return;
+
+    if (sks->end - sks->s < 16) {
+        sks->truncated = true;
+        strcpy(thisbuf, " ...");
+    } else {
+        k &= 255;			       /* force unsigned */
+        if (k==27)
+            strcpy(thisbuf, " ESC");
+        else if (k<32 || k==127)
+            sprintf(thisbuf, " ^%c", k ^ 64);
+        else if (k<127)
+            sprintf(thisbuf, " %c", k);
+        else
+            sprintf(thisbuf, " <0x%2X>", k);
+    }
+
+    strcpy(sks->s, thisbuf);
+    sks->s += strlen(sks->s);
 }
 
 /*
@@ -82,19 +99,25 @@
 #if defined(unix) && !defined(GO32)
     if (update_required)
 	update();
-    safe_update = TRUE;
+    safe_update = true;
 #endif
     last_char = display_getkey();
 #if defined(unix) && !defined(GO32)
-    safe_update = FALSE;
+    safe_update = false;
 #endif
     strcpy(message, "Unknown key sequence");
-    strkey(message+strlen(message), last_char);
+
+    struct strkey_state sks;
+    sks.s = message + strlen(message);
+    sks.end = message + sizeof(message);
+    sks.truncated = false;
+
+    strkey(&sks, last_char);
     kt = base[(unsigned char) last_char];
     if (!kt) {
 	display_beep();
 	while (display_input_to_flush())
-	    strkey(message+strlen(message), display_getkey());
+	    strkey(&sks, display_getkey());
 	return;
     }
 
@@ -102,18 +125,18 @@
 #if defined(unix) && !defined(GO32)
 	if (update_required)
 	    update();
-	safe_update = TRUE;
+	safe_update = true;
 #endif
 	last_char = display_getkey();
 #if defined(unix) && !defined(GO32)
-	safe_update = FALSE;
+	safe_update = false;
 #endif
-	strkey(message+strlen(message), last_char);
+	strkey(&sks, last_char);
 	kt = kt->e.extended[(unsigned char) last_char];
 	if (!kt) {
 	    display_beep();
 	    while (display_input_to_flush())
-		strkey(message+strlen(message), display_getkey());
+		strkey(&sks, display_getkey());
 	    return;
 	}
     }
diff -Naur tweak-3.02/main.c tweak-3.02.patched/main.c
--- tweak-3.02/main.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/main.c	2021-09-07 14:21:21.903810301 -0400
@@ -200,20 +200,20 @@
 char *pname;
 char *filename = NULL;
 buffer *filedata, *cutbuffer = NULL;
-int fix_mode = FALSE;
-int look_mode = FALSE;
-int eager_mode = FALSE;
-int insert_mode = FALSE;
+bool fix_mode = false;
+bool look_mode = false;
+bool eager_mode = false;
+bool insert_mode = false;
 int edit_type = 1;		       /* 1,2 are hex digits, 0=ascii */
-int finished = FALSE;
-int marking = FALSE;
-int modified = FALSE;
-int new_file = FALSE;		       /* shouldn't need initialisation -
+bool finished = false;
+bool marking = false;
+bool modified = false;
+bool new_file = false;                 /* shouldn't need initialisation -
 					* but let's not take chances :-) */
 fileoffset_t width = 16;
 fileoffset_t realoffset = 0, offset = 16;
 
-int ascii_enabled = TRUE;
+bool ascii_enabled = true;
 
 fileoffset_t file_size = 0, top_pos = 0, cur_pos = 0, mark_point = 0;
 
@@ -284,13 +284,13 @@
 		}
 		break;
 	      case 'f': case 'F':
-		fix_mode = TRUE;
+		fix_mode = true;
 		break;
 	      case 'l': case 'L':
-		look_mode = TRUE;
+		look_mode = true;
 		break;
 	      case 'e': case 'E':
-		eager_mode = TRUE;
+		eager_mode = true;
 		break;
 	      case 'D':
 		write_default_rc();
@@ -339,11 +339,11 @@
 		  "Width reduced to %"OFF"d to fit on the screen", width);
     }
     if (4*width+14 > display_cols) {
-	ascii_enabled = FALSE;
+	ascii_enabled = false;
 	if (edit_type == 0)
 	    edit_type = 1;	       /* force to hex mode */
     } else
-	ascii_enabled = TRUE;
+	ascii_enabled = true;
     offset = realoffset % width;
     if (!offset)
 	offset = width;
@@ -358,11 +358,11 @@
 
     display_setup();
 
-    display_define_colour(COL_BUFFER, -1, -1, FALSE);
-    display_define_colour(COL_SELECT, 0, 7, TRUE);
-    display_define_colour(COL_STATUS, 11, 4, TRUE);
-    display_define_colour(COL_ESCAPE, 9, 0, FALSE);
-    display_define_colour(COL_INVALID, 11, 0, FALSE);
+    display_define_colour(COL_BUFFER, -1, -1, false);
+    display_define_colour(COL_SELECT, 0, 7, true);
+    display_define_colour(COL_STATUS, 11, 4, true);
+    display_define_colour(COL_ESCAPE, 9, 0, false);
+    display_define_colour(COL_INVALID, 11, 0, false);
 
     for (i=0; i<256; i++) {
 	sprintf(hex[i], "%02X", i);
@@ -412,7 +412,7 @@
 		     "opened %s (size %"OFF"d == 0x%"OFF"X).",
 		     fname, file_size, file_size);
 	}
-	new_file = FALSE;
+	new_file = false;
     } else {
 	if (look_mode || fix_mode) {
 	    fprintf(stderr, "%s: file %s not found, and %s mode active\n",
@@ -421,19 +421,19 @@
 	}
 	filedata = buf_new_empty();
 	snprintf(message, sizeof(message), "New file %s.", fname);
-	new_file = TRUE;
+	new_file = true;
     }
 }
 
 /*
- * Save the file. Return TRUE on success, FALSE on error.
+ * Save the file. Return true on success, false on error.
  */
-int save_file (void) {
+bool save_file (void) {
     FILE *fp;
     fileoffset_t pos = 0;
 
     if (look_mode)
-	return FALSE;		       /* do nothing! */
+	return false;		       /* do nothing! */
 
     if ( (fp = fopen (filename, "wb")) ) {
 	static char buffer[SAVE_BLKSIZ];
@@ -446,25 +446,25 @@
 	    buf_fetch_data (filedata, buffer, size, pos);
 	    if (size != fwrite (buffer, 1, size, fp)) {
 		fclose (fp);
-		return FALSE;
+		return false;
 	    }
 	    pos += size;
 	}
     } else
-	return FALSE;
+	return false;
     fclose (fp);
-    return TRUE;
+    return true;
 }
 
 /*
  * Make a backup of the file, if such has not already been done.
- * Return TRUE on success, FALSE on error.
+ * Return true on success, false on error.
  */
-int backup_file (void) {
+bool backup_file (void) {
     char backup_name[FILENAME_MAX];
 
     if (new_file)
-	return TRUE;		       /* unnecessary - pretend it's done */
+	return true;		       /* unnecessary - pretend it's done */
     strcpy (backup_name, filename);
 #if defined(unix) && !defined(GO32)
     strcat (backup_name, ".bak");
@@ -498,7 +498,7 @@
     int scrsize, scroff, llen, i, j;
     fileoffset_t currpos;
     fileoffset_t marktop, markbot;
-    int mark;
+    bool mark;
     char *p;
     unsigned char c, *q;
     char *linebuf;
@@ -657,15 +657,15 @@
     display_refresh ();
 }
 
-volatile int safe_update, update_required;
+volatile bool safe_update, update_required;
 void update (void);
 
 /*
- * Get a string, in the "minibuffer". Return TRUE on success, FALSE
+ * Get a string, in the "minibuffer". Return true on success, false
  * on break. Possibly syntax-highlight the entered string for
  * backslash-escapes, depending on the "highlight" parameter.
  */
-int get_str (char *prompt, char *buf, int highlight) {
+bool get_str (char *prompt, char *buf, bool highlight) {
     int maxlen = 79 - strlen(prompt);  /* limit to 80 - who cares? :) */
     int len = 0;
     int c;
@@ -702,17 +702,17 @@
 	display_refresh();
 	if (update_required)
 	    update();
-	safe_update = TRUE;
+	safe_update = true;
 	c = display_getkey();
-	safe_update = FALSE;
+	safe_update = false;
 	if (c == 13 || c == 10) {
 	    buf[len] = '\0';
-	    return TRUE;
+	    return true;
 	} else if (c == 27 || c == 7) {
 	    display_beep();
 	    display_post_error();
 	    snprintf(message, sizeof(message), "User Break!");
-	    return FALSE;
+	    return false;
 	}
 
 	if (c >= 32 && c <= 126) {
@@ -794,12 +794,12 @@
     if (safe_update)
 	update();
     else
-	update_required = TRUE;
+	update_required = true;
 }
 
-fileoffset_t parse_num (char *buffer, int *error) {
+fileoffset_t parse_num (char *buffer, bool *error) {
     if (error)
-	*error = FALSE;
+	*error = false;
     if (!buffer[strspn(buffer, "0123456789")]) {
 	/* interpret as decimal */
 	return ATOOFF(buffer);
@@ -812,6 +812,6 @@
     } else {
 	return 0;
 	if (error)
-	    *error = TRUE;
+	    *error = true;
     }
 }
diff -Naur tweak-3.02/rcfile.c tweak-3.02.patched/rcfile.c
--- tweak-3.02/rcfile.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/rcfile.c	2021-09-07 14:21:21.903810301 -0400
@@ -146,7 +146,7 @@
     char rcbuffer[256];
     char rcname[FILENAME_MAX];
     int lineno = 0;
-    int errors = FALSE, errors_here;
+    bool errors = false, errors_here;
 
 #if defined(unix) && !defined(GO32)
     rcname[0] = '\0';
@@ -200,7 +200,7 @@
 	    strcpy (rcbuffer, *p++);
 	}
 	lineno++;
-	errors_here = FALSE;
+	errors_here = false;
 
 	/*
 	 * Now we have a line from the .rc file, wherever it's
@@ -242,7 +242,7 @@
 	    else {
 		fprintf(stderr, "%s: no key sequence after \"bind\" command"
 			" on line %d of "RCNAME, pname, lineno);
-		errors = TRUE;
+		errors = true;
 		continue;
 	    }
 
@@ -255,8 +255,8 @@
 		    if (!*++q) {
 			fprintf(stderr, "%s: nothing follows `^' on line %d"
 				" of "RCNAME, pname, lineno);
-			errors = TRUE;
-			errors_here = TRUE;
+			errors = true;
+			errors_here = true;
 		    } else {
 			*s++ = *q++ ^ 0x40;
 		    }
@@ -264,8 +264,8 @@
 		    if (!*++q) {
 			fprintf(stderr, "%s: nothing follows `\\' on line %d"
 				" of "RCNAME, pname, lineno);
-			errors = TRUE;
-			errors_here = TRUE;
+			errors = true;
+			errors_here = true;
 		    } else if (*q == '\\' || *q == '^') {
 			*s++ = *q++;
 		    } else if (isxdigit((unsigned char)*q) &&
@@ -278,8 +278,8 @@
 		    } else {
 			fprintf(stderr, "%s: badly formed `\\' sequence on"
 				" line %d of "RCNAME, pname, lineno);
-			errors = TRUE;
-			errors_here = TRUE;
+			errors = true;
+			errors_here = true;
 		    }
 		} else
 		    *s++ = *q++;
@@ -307,7 +307,7 @@
 		fprintf(stderr, "%s: unrecognised key action \"%s\""
 			" at line %d of "RCNAME"\n",
 			pname, r, lineno);
-		errors = TRUE;
+		errors = true;
 	    }
 	} else if (!strcmp(q, "width")) {
 	    width = atoi(r);
@@ -317,7 +317,7 @@
 	    fprintf(stderr, "%s: unrecognised "RCNAME" directive \"%s\""
 		    " at line %d of "RCNAME"\n",
 		    pname, q, lineno);
-	    errors = TRUE;
+	    errors = true;
 	}
     }
     if (errors)
diff -Naur tweak-3.02/slang.c tweak-3.02.patched/slang.c
--- tweak-3.02/slang.c	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/slang.c	2021-09-07 14:21:21.918810299 -0400
@@ -69,7 +69,7 @@
 	exit (1);
     }
     SLang_set_abort_signal (NULL);
-    SLtt_Use_Ansi_Colors = TRUE;
+    SLtt_Use_Ansi_Colors = true;
 
     get_screen_size ();
     if (SLsmg_init_smg () < 0) {
@@ -109,7 +109,7 @@
     SLsmg_write_nchars(str, len);
 }
 
-void display_define_colour(int colour, int fg, int bg, int reverse)
+void display_define_colour(int colour, int fg, int bg, bool reverse)
 {
     static char *colours[16] = {
 	"black", "red", "green", "brown",
@@ -142,10 +142,15 @@
 
 int display_getkey(void)
 {
-    return SLang_getkey();
+    int key = SLang_getkey();
+    if (key == SLANG_GETKEY_ERROR) {
+        /* A failure to read from standard input is fatal */
+        exit(1);
+    }
+    return key;
 }
 
-int display_input_to_flush(void)
+bool display_input_to_flush(void)
 {
     return SLang_input_pending(0);
 }
@@ -153,7 +158,7 @@
 void display_post_error(void)
 {
     SLKeyBoard_Quit = 0;
-    SLang_Error = 0;
+    SLang_set_error (0);
 }
 
 void display_recheck_size(void)
diff -Naur tweak-3.02/tweak.h tweak-3.02.patched/tweak.h
--- tweak-3.02/tweak.h	2016-03-22 17:12:51.000000000 -0400
+++ tweak-3.02.patched/tweak.h	2021-09-07 14:21:21.903810301 -0400
@@ -16,12 +16,7 @@
 
 #endif
 
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-#define TRUE 1
-#endif
+#include <stdbool.h>
 
 #define EVER ;;
 
@@ -80,23 +75,25 @@
 extern char decstatus[], hexstatus[], *statfmt;
 extern char last_char, *pname, *filename;
 extern buffer *filedata, *cutbuffer;
-extern int fix_mode, look_mode, insert_mode, edit_type, finished, marking;
+extern bool fix_mode, look_mode, insert_mode, finished, marking;
+extern int edit_type;
 extern fileoffset_t file_size, top_pos, cur_pos, mark_point;
-extern int scrlines, modified, new_file;
+extern int scrlines;
+extern bool modified, new_file;
 extern fileoffset_t width, offset, realoffset;
-extern int ascii_enabled;
+extern bool ascii_enabled;
 
 #ifdef unix
-extern volatile int safe_update, update_required;
+extern volatile bool safe_update, update_required;
 extern void update (void);
 #endif
 
 extern void fix_offset(void);
-extern fileoffset_t parse_num (char *buffer, int *error);
+extern fileoffset_t parse_num (char *buffer, bool *error);
 
 extern void draw_scr (void);
-extern int backup_file (void);
-extern int save_file (void);
+extern bool backup_file (void);
+extern bool save_file (void);
 
 extern void act_self_ins (void);
 extern keyact parse_action (char *);
@@ -107,7 +104,7 @@
 extern Search *build_search (char *, int);
 void free_search(Search *s);
 
-extern int get_str (char *, char *, int);
+extern bool get_str (char *, char *, bool);
 extern int parse_quoted (char *);
 extern void suspend (void);
 
@@ -137,11 +134,11 @@
 extern void display_refresh(void);
 extern void display_write_str(char *str);
 extern void display_write_chars(char *str, int len);
-extern void display_define_colour(int colour, int fg, int bg, int reverse);
+extern void display_define_colour(int colour, int fg, int bg, bool reverse);
 extern void display_set_colour(int colour);
 extern void display_clear_to_eol(void);
 extern int display_getkey(void);
-extern int display_input_to_flush(void);
+extern bool display_input_to_flush(void);
 extern void display_post_error(void);
 extern void display_recheck_size(void);
 
